#include "util.hpp"
#include "config.hpp"
#include "data_manage.hpp"
#include "hot_manage.hpp"
//#include "http_server.hpp"
#include <thread>
#include "epoll_server.hpp"

using namespace std;

extern cloud::data_manage *dm;
cloud::data_manage *dm = new cloud::data_manage();

void test_file_util(string &path)
{
    // cloud::file_util fu(path);
    // cout << fu.file_name() << endl;
    // cout << fu.file_size() << endl;
    // cout << fu.last_modify_time() << endl;
    // cout << fu.last_access_time() << endl;

    // cloud::file_util fu(path);
    // string file;
    // fu.get_content(file);
    // cloud::file_util fu2("./test.txt");
    // fu2.set_content(file);

    // cloud::file_util fu("test.txt");
    // fu.compress("test.txt.lz");
    // cloud::file_util fu2("test.txt.lz");
    // fu2.decompress("test2.txt");

    cloud::file_util fu("test_dir");
    cout << fu.exist() << endl;
    fu.create_dir();
    vector<string> v;
    fu.scan_dir(v);
    for(auto &it : v)
    {
        cout << it << endl;
    }
}

void test_json_util()
{
    string name = "张三";
    int age = 20;
    Json::Value root;
    root["姓名"] = name;
    root["年龄"] = age;
    string str;
    cloud::json_util::serialize(root, str);
    cout << str << endl;

    string str2 = R"({"姓名":"李四", "年龄":20, "成绩单":[66.6, 77.7, 88.8, 99.9]})";
    Json::Value root2;
    cloud::json_util::deserialize(root, str2);
    cout << root["姓名"].asString() << endl;
    cout << root["年龄"].asInt() << endl;
}

void test_config()
{
    cloud::config* c = cloud::config::get_instance();
    cout << c->get_hot_time() << endl;
    cout << c->get_server_ip() << endl;
    cout << c->get_server_port() << endl;
    cout << c->get_download_prefix() << endl;
    cout << c->get_packfile_suffix() << endl;
    cout << c->get_pack_dir() << endl;
    cout << c->get_back_dir() << endl;
    cout << c->get_backup_file() << endl;
}

void test_data_manage()
{
    // cloud::backup_info b("bundle.h");
    // cout << b._pack_flag << endl;
    // cout << b._fsize << endl;
    // cout << b._atime << endl;
    // cout << b._mtime << endl;
    // cout << b._real_path << endl;
    // cout << b._pack_path << endl;
    // cout << b._url << endl;


    // cloud::data_manage dm;
    // cloud::backup_info i("bundle.h");
    // dm.insert(i);

    // cout << "------------get_one_by_url-------------------" << endl;
    // dm.get_one_by_url("/download/bundle.h", i);
    // i.print();

    // i._pack_flag = true;
    // dm.updata(i);
    // cout << "------------get_one_by_realpath--------------" << endl;
    // dm.get_one_by_realpath("bundle.h", i);
    // i.print();

    // cout << "------------get_all--------------------------" << endl;
    // cloud::backup_info i2("makefile");
    // dm.insert(i2);
    // vector<cloud::backup_info> v;
    // dm.get_all(v);
    // for(auto &it : v)
    // {
    //     it.print();
    // }


    cloud::data_manage dm;
    vector<cloud::backup_info> v;
    dm.get_all(v);
    for(auto &it : v)
    {
        it.print();
    }
}

void test_hot_manage()
{
    cloud::hot_manage hm;
    hm.start();
}

// void test_http_server()
// {
//     cloud::http_server s;
//     s.init();
//     s.start();
// }

void test_epoll()
{
    cloud::epoll_server server;
    server.init();
    server.dispatch();
}

// 服务端整体功能测试
void test_server()
{
    thread hot_manage_thread(test_hot_manage);
    thread server_thread(test_epoll);

    hot_manage_thread.join();
    server_thread.join();
}

int main(int argc, char *argv[])
{
    // DEBUG("%s", "hello");
    string path = "./test.cc";
    if(argc == 2)
    {
        path = argv[1];
    }
    
    // test_file_util(path);
    // test_json_util();
    // test_config();
    // test_data_manage();
    // test_hot_manage();
    // test_http_server();
    // test_epoll();
    test_server();

    return 0;
}